/*
 * @Description: 新旧节点是同一个节点的处理情况, 比text, children
 * @Author: wangqi
 * @Date: 2021-05-14 23:32:47
 * @LastEditTime: 2021-05-15 14:31:52
 */

import createElement from './createElement'
import updateChildren from './updateChildren'

export default function patchVnode(oldVnode, newVnode) {
    if (oldVnode === newVnode) { return '新旧节点是同一个对象' };

    // newVnode存在text则意味没有children, 那么oldVnode的内容将被newVnode内容填充
    if (newVnode.text && (!newVnode.children || newVnode.children.length == 0)) {
        if (newVnode.text == oldVnode.text) { return '新旧节点text没变化' };
        // 替换真实dom
        oldVnode.elm.innerText = newVnode.text;

        // newVnode不存在text则意味有children,
    } else {

        // 老节点存在children       
        if (oldVnode.children && oldVnode.children.length > 0) {
            updateChildren(oldVnode.elm, oldVnode.children, newVnode.children);

            // 如果老节点不存在children
        } else {
            // 注意这里的清空是指 dom的清空, 因为最后需要append的是真实Dom
            oldVnode.elm.innerHTML = '';
            for (let i = 0; i < newVnode.children.length; i++) {
                oldVnode.elm.appendChild(createElement(newVnode.children[i]))
            }
        }

    }
};
